// 通用函数
import useClipboard from "vue-clipboard3";
import { ElMessage } from "element-plus";

// 百分比格式化
export function percentFormat(row: EmptyArrayType, column: number, cellValue: string) {
	return cellValue ? `${cellValue}%` : "-";
}

// 小数格式化
export function scaleFormat(value: string = "0", scale: number = 4) {
	return Number.parseFloat(value).toFixed(scale);
}

// 小数格式化
export function scale2Format(value: string = "0") {
	return Number.parseFloat(value).toFixed(2);
}

// 点击复制文本
const { toClipboard } = useClipboard();
export function copyText(text: string) {
	return new Promise((resolve, reject) => {
		try {
			// 复制
			toClipboard(text);
			// 下面可以设置复制成功的提示框等操作
			ElMessage.success("复制成功!");
			resolve(text);
		} catch (e) {
			// 复制失败
			ElMessage.error("复制失败!");
			reject(e);
		}
	});
}

// 获取 url 上指定 key 的 query 数据
export function getUrlQuery(url: string, key: string) {
	const index = url.indexOf("?");
	if (index !== -1) {
		const queryStrArr = url.substring(index + 1).split("&");
		for (var i = 0; i < queryStrArr.length; i++) {
			const itemArr = queryStrArr[i].split("=");
			if (itemArr[0] === key) {
				return itemArr[1];
			}
		}
	}
	return null;
}

/**
 * 传入的参数类型 ->  返回值
 * 0						  ->  "Number"
 * ""						  ->  "String"
 * []             ->  "Array"
 * {}             ->  "Object"
 * function(){}   ->  "Function"
 * null           ->  "Null"
 * undefined      ->  "Undefined"
 * true / false   ->  "Boolean"
 * new Date()     ->  "Date"
 * new Error()    ->  "Error"
 * new RegExp()   ->  "RegExp"
 */
export function whoami(val: any) {
	return Object.prototype.toString.call(val).slice(8, -1);
}

// 格式化错误信息
export function formatErrMsg(err: any) {
	return whoami(err) === "String" ? err : JSON.stringify(err);
}

// 删除对象中的空值
export function deleteEmptyProperty(data: EmptyObjectType) {
	Object.keys(data).forEach(key => {
		if (data[key] === null || data[key] === undefined) delete data[key];
	});
}

/**
 * 构造树形结构数据
 * @param {*} data 数据源
 * @param {*} orderNum 排序字段 默认 'order_num'
 * @param {*} parentId 父节点字段 默认 'parent'
 * @param {*} rootId 根Id 默认从 data 中获取最小的 parent 值
 */
export function constructTree(
	data: EmptyArrayType,
	orderNum: string = "order_num",
	parentId: string = "parent",
	rootId?: number
) {
	// 确定根节点的id值
	rootId = rootId || Math.min(...data.map(item => item[parentId]));
	// 对源数据深度克隆
	const cloneData = JSON.parse(JSON.stringify(data));
	// 循环所有项
	const treeData = cloneData.filter((father: any) => {
		// 构造路由树时，如果存在重定向且为 noRedirect，则删除重定向属性
		if (father.redirect && father.redirect === "noRedirect") delete father.redirect;
		// 返回每一项的子级数组
		const branchArr = cloneData.filter((child: any) => {
			return child[parentId] === father.id;
		});
		// 如果存在子级，则给它们排序并连接到父级的 children 属性上
		if (branchArr.length > 0) {
			branchArr.sort((a: EmptyObjectType, b: EmptyObjectType) => a[orderNum] - b[orderNum]);
			father.children = branchArr;
		}
		// 返回树形结构数据的第一层
		return !father[parentId] || father[parentId] === rootId;
	});
	// 循环结束后，排序并返回树形结构数据
	treeData.sort((a: EmptyObjectType, b: EmptyObjectType) => a[orderNum] - b[orderNum]);
	return treeData.length > 0 ? treeData : data;
}
